package com.mmm.station.base.utils.generator;

import org.apache.commons.lang3.text.WordUtils;
import org.springframework.util.StringUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 代码自动生成器，仅支持 DWR + SpringMVC + Mybatis 架构
 * 
 * @Title: CodeGenerator.java
 * @Package com.hicores.base.generator
 * @Description:
 * @author: alan
 * @date: 2016年5月12日 下午8:25:22
 * @version V1.0
 */
public class CodeGenerator {

	Config config = null;

	// 开关，用来略过生成某些文件，或者进行配置文件修改，可以设置进行修改
	private boolean entityClsOn = false;
	private boolean mapperClsOn = false;
	private boolean mapperFileOn = false;
	private boolean serviceClsOn = false;
	private boolean implServiceClsOn = false;
	private boolean ctrlClsOn = false;
	private boolean configChgOn = false;
	
	//文件夹名字，一般不可修改
	public static enum enmClassType {entity ,mapper,mapperXML,service,serviceImpl ,ctroller};
	
	
	
	// 内部属性，中间生成
	//private String keyFieldType; // 主键字段的类型：内部调用
	private List<Field> fields; // 字段Map, key:字段名 | value:类型
	private List<Field> viewFields; // 字段Map, key:字段名 | value:类型
	private Field keyField;
//	private boolean hasAreaId = false;
	
	private String editFieldPart = "";

	/**
	 * 构造函数
	 * 
	 * @param dbFile
	 *            数据库配置文件
	 * @param basePackage
	 *            基础Package地址
	 * @param baseObjName
	 *            基础对象名称，将作为所有类文件名字的一部分
	 * @param shortObjName
	 *            对象名缩写，用于方法名
	 * @param tableName
	 *            表名
	 * @param keyFieldName
	 *            主键字段名
	 */
	public CodeGenerator(Config config) {
		super();
		this.config = config;
		fields = new ArrayList<Field>();
		viewFields = new ArrayList<Field>();
		keyField = null;
		

	}

	/**
	 * 开始生成代码，主要调用方法，必须事先设置好各项属性
	 * 
	 * @author: alan
	 * @date: 2016年5月12日
	 * @Title: run
	 */
	public void run() {
		try {
			System.out.println("Starting...");
//			this.createFilesPath();
			

			//System.out.println("Getting table fields....");
//			String sql = "select * from " + config.getTableName() + " where 1=0";
			String sql = "SELECT * FROM information_schema.COLUMNS WHERE table_schema = 'shop' AND table_name ='" + config.getTableName()+"'";

			fields = getStructure(sql);
			if(StringUtils.isEmpty(config.getViewSql())){
				viewFields = fields;
				config.setViewSql("select A.* from " + config.getTableName() +" A");
			}else{
				String sql1 = config.getViewSql();
				if(sql1.indexOf(" where ")<0) sql1 += " where 1=0 ";
				viewFields = getStructure(sql1);
			}
			
//			for (Field field : viewFields) {
//				
//				System.out.println(field.getColName() + ":" + field.getFieldName()
//						+ ":" +field.getType()+ ":" +field.getJdbcType());
//			}
//			//找到Key的类型
//			for (String colName : hmFields.keySet()) {
////				if(config.getKeyFieldName().equalsIgnoreCase(colName)){
////					key
////					break;
////				}
//				System.out.println(colName + ":" + hmFields.get(colName) + ":" + getPropByColName(colName));
//			}
//
			// write Entity class
			if (isEntityClsOn()) {
				System.out.println("1-Writing entity class....");
				this.fillEntityClass();
			}
			//mapperFile
			if (isMapperFileOn()) {
				System.out.println("2-Writing mapper xml file....");
				this.fillMapperFile();
			}
			//mapperclass
//			if (isMapperClsOn()) {
//				System.out.println("3-Writing mapper class....");
//				this.fillMapperClass();
//			}
//			//service
//			if (isServiceClsOn()) {
//				System.out.println("4-Writing service class....");
//				this.fillServiceClass();
//			}
//
//			if (isImplServiceClsOn()) {
//				System.out.println("5-Writing service implemental class....");
//				this.fillServiceImplClass();
//			}
			
//			//controller
//			if (isCtrlClsOn()) {
//				System.out.println("6-Writing controller class....");
//				this.fillControllerClass();
//			}

			if (isConfigChgOn()) {
				System.out.println("7-Change MyBatis Config File....");
				this.registerFiles();	
			}
			
			System.out.println("===Successfully generated files. ===");
			System.out
					.println("Please refresh your directory to view these files.");
		} catch (Exception e) {

			e.printStackTrace();
			System.out.println("Failed!!!!!!!!");
		}
	}
	

	/**
	 * 把创建的类和文件注册到daoDefault.xml和sqlmapConfigDefault.xml
	 *
	 */
	private void registerFiles(){
		try {
			//dao file
			String temp = "";
			String configFile = config.getBaseSrcFilePath().replace("java", "resources")+"\\mybatis-config.xml";
			String content = FileManager.readFile(configFile);
			
			temp = "<mapper resource=\""+ config.getFullClsName(enmClassType.mapper).replace(".", "/") +".xml\"/>";
			if(content.indexOf(temp)>0){
				//已经存在
				return;
			}
			int pos = content.indexOf("</mappers>");
			
			content = content.substring(0,pos) + 
						"\t" + temp + "\n\t" + content.substring(pos);			
			FileManager.writeFile(content,configFile,true);

			System.out.println("Successfully set xml file to mybatis-config.xml");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		}
	
	//fillMapperFile
	private void fillMapperFile(){
		StringBuffer content = new StringBuffer();

		content.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").
				append("\n<!DOCTYPE mapper \nPUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"").
				append(" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">");
		
		content.append("\n<mapper namespace=\"").
				append(config.getFullClsName(enmClassType.mapper)).
				append("\">");
		//生成一个resultMap,使用hmViewFields
		content.append("\n\n<resultMap id=\"resultMap\" type=\"")
				.append(config.getFullClsName(enmClassType.entity)).append("\">");

		for (Field f : viewFields) {
			content.append("\n\t<result column=\"").append(f.getColName())
					.append("\" property=\"").append(f.getFieldName())
//					.append("\" jdbcType=\"").append(f.getJdbcType())
					.append("\"/>");
		}			
		content.append("\n</resultMap>");		
		
		///Base_Column_List
		//content.append("\n\n <!--Base_Column_List-->");
		//content.append("\n<sql id=\"Base_Column_List\" >
		
		///selectByKey
		content.append("\n\n <!--selectByKey-->");
		content.append("\n<select id=\"selectByKey\" resultMap=\"resultMap\" parameterType=\""+
					config.getFullClsName(enmClassType.entity)  +"\">");
		content.append("\n "  ).
				//append(temp).
				append(config.getViewSql()).
				append("\n\t where A.").
				append(keyField.getColName()).
				append(" = #{").append(keyField.getFieldName()).append("} ");
		if(config.isAreaFilter()){
			content.append("\n\t\t and ").append(config.getAreaFilter(true));
		}
		content.append("\n</select>");


		//selectByEntity
		content.append("\n\n <!--selectByEntity-->");
		content.append("\n<select id=\"selectByEntity\" resultMap=\"resultMap\" parameterType=\""+
				config.getFullClsName(enmClassType.entity)  +"\">");
		content.append("\n "  ).
				//append(temp).
						append(config.getViewSql()).append("\n\t\t  where 1=1 ");

		if(config.isAreaFilter()){
			content.append(" and ").append(config.getAreaFilter(true));
		}
		content.append(getSQLWhere("fields"));
		content.append("\n\t\t").append(config.getOrderBy(true));
		content.append("\n</select>");



		///selectPageList
		content.append("\n\n <!--selectPage-->");
		content.append("\n<select id=\"selectPage\" resultMap=\"resultMap\" >");
		content.append("\n "  ).
				//append(temp).
				append(config.getViewSql()).append("\n\t\t  where 1=1 ");
		
		if(config.isAreaFilter()){
			content.append(" and ").append(config.getAreaFilter(true));
		}
		content.append(getSQLWhere("fields"));	// 放在fields属性里面
		content.append("\n\t\t").append(config.getOrderBy(true));
		
		content.append("\n</select>");
		
		
		
		///selectList
		content.append("\n\n <!--selectList-->");
//		content.append("\n<select id=\"selectList\" resultMap=\"resultMap\" parameterType=\""+
//					config.getFullClsName(enmClassType.entity)  +"\">");
		content.append("\n<select id=\"selectList\" resultMap=\"resultMap\" >");
		content.append("\n "  ).
				//append(temp).
				append(config.getViewSql()).append("\n\t\t  where 1=1 ");
		
		if(config.isAreaFilter()){
			content.append(" and ").append(config.getAreaFilter(true));
		}
		content.append(getSQLWhere("fields"));
		content.append("\n\t\t").append(config.getOrderBy(true));
		
		content.append("\n</select>");
		
		
		
		///selectCount
//		content.append("\n\n <!--selectCount-->");
//		content.append("\n<select id=\"selectCount\"  resultType=\"java.lang.Integer\"  parameterType=\""+
//					config.getFullClsName(enmClassType.entity)  +"\">");
//		content.append("\n select count(*) from "  ).
//				//append(temp).
//				append(config.getTableName()).append(" A\n\t\t  where 1=1 ");
//
//		if(config.isAreaFilter()){
//			content.append(" and ").append(config.getAreaFilter(true));
//		}
//		content.append(getSQLWhere(null));
//		content.append("\n</select>");
		

		
		///selectDupCount
//		content.append("\n\n <!--selectDupCount-->");
//		content.append("\n<select id=\"selectDupCount\"  resultType=\"java.lang.Integer\"  parameterType=\""+
//					config.getFullClsName(enmClassType.entity)  +"\">");
//		content.append("\n select count(*) from "  ).
//				//append(temp).
//				append(config.getTableName()).append(" A\n\t\t  where 1=1 ");
//
//		if(config.isAreaFilter()){
//			content.append(" and ").append(config.getAreaFilter(true));
//		}
//		content.append(getDupSQLWhere());
//		content.append("\n</select>");
//
		
		//////////////////查询结束,操作/////////////////////
		
		String temp = "";
		String temp1 = "";
		String temp2 = "";
		String temp3 = "";	//动态更新
		String temp0 = "\n\t<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\" >";
		String temp10 = "\n\t<trim prefix=\" values (\" suffix=\")\" suffixOverrides=\",\" >";
		int i = 0;
		//新增
		for (Field f : fields) {
			//新增的字段
			if(StringUtils.isEmpty(temp)){
				temp = ""+f.getColName();
//				temp1 = "#{" + f.getFieldName() + ",jdbcType=" + f.getJdbcType() + "}";
				temp1 = "#{" + f.getFieldName() + "}";
			}else{
				if(i % 2 == 0){
					temp += ",\n\t\t" + f.getColName();
					temp1 += ",\n\t\t"+ f.getBatisValue();
					
				}else{
					temp= temp + " , " + f.getColName();
					temp1 = temp1 + " , " +f.getBatisValue();
				}
			}
			i++;
			

			temp0 += "\n\t\t<if test=\""+ f.getFieldName() +" != null\" >";
			temp0 += "\n\t\t\t" + f.getColName();
			temp0 += ",\n\t\t</if>";
			

			temp10 += "\n\t\t<if test=\""+ f.getFieldName() +" != null\" >";
			temp10 += "\n\t\t\t" + f.getBatisValue();
			temp10 += ",\n\t\t</if>";
			
			//更新的字段
			if(f.excludeUpdate()) continue;		//跳过不可更新的一些字段 
			if(keyField.equal(f)) continue;		//跳过主键
			if(StringUtils.isEmpty(temp2)){
				temp2 = f.getColName() +  " = " + f.getBatisValue();
			}else{
				temp2+=",\n\t\t" + f.getColName() +  " = " + f.getBatisValue();
			}
			
			temp3 += "\n\t\t<if test=\""+ f.getFieldName() +" != null\" >";
			temp3 += "\n\t\t\t" + f.getColName() +  " = " + f.getBatisValue();
			temp3 += ",\n\t\t</if>";
			
		}	
		temp0 += "\n\t</trim>";
		temp10 += "\n\t</trim>";
		//新增
		content.append("\n\n <!--insert-->");
		content.append("\n<insert id=\"insert"+ WordUtils.capitalize(config.getShortObjName())+"\" parameterType=\"" ).
				append(config.getFullClsName(enmClassType.entity)).
				append("\">");	
		content.append("\n insert into ").
				append(config.getTableName()).
				append("(");		
		content.append(temp).append(") \n values (");
		content.append(temp1).append(")");
		content.append("\n</insert>");
		//动态新增
		content.append("\n\n <!--insertSelective-->");
		content.append("\n<insert id=\"insertSelective"+ WordUtils.capitalize(config.getShortObjName())+"\" parameterType=\"" ).
				append(config.getFullClsName(enmClassType.entity)).
				append("\">");	
		content.append("\n insert into ").
				append(config.getTableName()).
				append(temp0).append(temp10);		
		content.append("\n</insert>");
		
		
		//修改
		content.append("\n\n <!--update-->");
		content.append("\n<update id=\"update"+ WordUtils.capitalize(config.getShortObjName())+"\" parameterType=\"" ).
				append(config.getFullClsName(enmClassType.entity)).
				append("\">");	
		content.append("\n update ").
				append(config.getTableName()).
				append(" set ");		
		content.append(temp2);
		content.append(" \n\twhere ").
			append(keyField.getColName()).
			append(" = #{").append(keyField.getFieldName()).append("} ");
		if(config.isAreaFilter()){
			content.append("\n\t\t and ").append(config.getAreaFilter(false));
		}
		content.append("\n</update>");
		//动态修改
		content.append("\n\n <!--updateSelective-->");
		content.append("\n<update id=\"updateSelective"+ WordUtils.capitalize(config.getShortObjName())+"\" parameterType=\"" ).
				append(config.getFullClsName(enmClassType.entity)).
				append("\">");	
		content.append("\n update ").
				append(config.getTableName()).
				append("\n\t<set>");		
		content.append(temp3);
		content.append("\n\t</set> \n\twhere ").
			append(keyField.getColName()).
			append(" = #{").append(keyField.getFieldName()).append("} ");
		if(config.isAreaFilter()){
			content.append("\n\t\t and ").append(config.getAreaFilter(false));
		}
		content.append("\n</update>");
		 
		//删除
		content.append("\n\n <!--deleteByKey-->");
		content.append("\n<delete id=\"deleteByKey\" parameterType=\""+ 
					config.getFullClsName(enmClassType.entity)  +"\">");
		content.append("\n delete from ").
				append(config.getTableName()).
				append(" where ").
				append(keyField.getColName()).
				append(" = #{").append(keyField.getFieldName()).append("} ");
		if(config.isAreaFilter()){
			content.append("\n\t\t and ").append(config.getAreaFilter(false));
		}
		content.append("\n</delete>");
		
		
		//updateDelFlag
		content.append("\n\n <!--updateDelFlag-->");
		content.append("\n<update id=\"updateDelFlag\" parameterType=\""+ 
					config.getFullClsName(enmClassType.entity)  +"\">");
		content.append("\n update ").
				append(config.getTableName()).
				append(" set del_flag = #{delFlag}  where ").
//				append(" set del_flag = #{delFlag,jdbcType=BIT}  where ").
				append(keyField.getColName()).
				append(" = #{").append(keyField.getFieldName()).append("} ");
		if(config.isAreaFilter()){
			content.append("\n\t\t and ").append(config.getAreaFilter(false));
		}
		content.append("\n</update>");
		
		
		//end 
		content.append("\n\n</mapper>");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.mapperXML),config.isOverwriteFile());
			System.out.println("Successfully wrote config file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	* @author: alan
	* @date: 2016年5月17日
	* @Title: getSQLWhere  
	* @return
	 */
	private String getSQLWhere(String container){
		StringBuffer content = new StringBuffer();
		String p ="";
//		if(!StringUtils.isEmpty(container))  p = container+".";
		String prefix = "A.";
		for (Field f : fields) {
			
			if(config.isAreaFilter() && f.isAreaField()) continue;
			String type = f.getJdbcType().toUpperCase();
			if(type.equals("TIMESTAMP")) continue;	//TIMESTAMP暂时不处理

//			else if(type.equals("INTEGER") || type.equals("SMALLINT")) {
//				content.append("\n\t\t<if test=\"").
//						append(f.getFieldName()).append(" &gt; 0\">");
//				content.append("\n\t\t\tand ").append(prefix + f.getColName()).append(" = ").
//						append(f.getBatisValue());
//				content.append("\n\t\t</if>");
//			}
			else if(type.equals("VARCHAR")) {
				content.append("\n\t\t<if test=\"").append(p).
						append(f.getFieldName()).append(" !=null and ").append(p).
						append(f.getFieldName()).append(" !=''\">");
				content.append("\n\t\t\tand instr(").append(prefix + f.getColName()).append(",").
						append(f.getBatisValue(container));
				content.append(")>0 \n\t\t</if>");
			}
			
			else {
				content.append("\n\t\t<if test=\"").append(p).
						append(f.getFieldName()).append(" !=null \">");
				content.append("\n\t\t\tand ").append(prefix + f.getColName()).append(" = ").
						append(f.getBatisValue(container));
				content.append("\n\t\t</if>");
			}
		}
		///content.replace(start, end, str)
		return content.toString();
	}
	

	private String getDupSQLWhere(){
		StringBuffer content = new StringBuffer();
		String prefix = "A.";
		for (Field f : fields) {
			if(config.isAreaFilter() && f.isAreaField()) continue;
			if(f.equal(keyField)){
				//Key 单独处理，应该是不等于
				content.append("\n\t\t<if test=\"").
				append(f.getFieldName()).append(" !=null \">");
					content.append("\n\t\t\tand ").append(prefix + f.getColName()).append(" != ").
							append(f.getBatisValue());
					content.append("\n\t\t</if>");
			}else if(f.getFieldName().equalsIgnoreCase("delflag")
					|| f.getColName().indexOf("parent_id") >0
					|| f.getColName().equalsIgnoreCase(config.getNameField())
					){
				content.append("\n\t\t<if test=\"").
				append(f.getFieldName()).append(" !=null \">");
				content.append("\n\t\t\tand ").append(prefix + f.getColName()).append(" = ").
						append(f.getBatisValue());
				content.append("\n\t\t</if>");
			}
		}
		return content.toString();
	}
	
	
	/**
	 * 填充Entity类
	* @author: alan
	* @date: 2016年5月16日
	* @Title: fillEntityClass
	 */
	private void fillEntityClass(){
		StringBuffer content = new StringBuffer("package ");
		StringBuffer c1 = new StringBuffer("");
		content.append(getPkgByClsFull( config.getFullClsName(enmClassType.entity))).append(";\n");
		content.append("\nimport java.util.Date;");
		content.append("\nimport java.io.Serializable;");
		content.append("\nimport com.mmm.base.entity.BaseEntity;;");
		
//		content.append("\nimport org.directwebremoting.annotations.DataTransferObject;");
		content.append("\n");
		content.append(config.getAutoComment("实体类"));
//		content.append("\n@DataTransferObject");
		content.append("\npublic class ").append(config.getEntityClsName());
		content.append(" extends BaseEntity<"+config.getEntityClsName()+"> implements Serializable {");
		
		content.append("\n\n\tprivate static final long serialVersionUID = 0L;");//.append(Long.).append(";");
		
		for (Field f : viewFields) {

			content.append("\n\n\t//").append(f.getComment());
			content.append("\n\tprivate ").append(f.getType()).append(" ").append(f.getFieldName()).append(";");
			
			//getter
			c1.append("\n\n\tpublic ").append(f.getType()).append(" ").append(f.getter()).append("{");
			c1.append("\n\t\treturn ").append(f.getFieldName()).append(";\n\t}");
			//setter
			c1.append("\n\n\tpublic void ").append(f.setter(f.getType() + " " + f.getFieldName())).append("{");
			c1.append("\n\t\tthis.").append(f.getFieldName()).append(" = ").append(f.getFieldName()).append(";\n\t}");
			
			
		}
		content.append("\n\n\t/*以下为手工添加属性*/\n\t\n\t");

		content.append(c1);
        //method getID
//		content.append("\n\n\tpublic int get").append(capitalizeKey(this.getPrimaryKeys())).append("(){");
//		content.append("\n\t\treturn ").append(this.getPrimaryKeys()).append(";");
//		content.append("\n\t}");
		content.append("\n}");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.entity),config.isOverwriteFile());
			System.out.println("Successfully create entity class file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成Service类
	* @author: alan
	* @date: 2016年5月16日
	* @Title: fillServiceClass
	 */
	private void fillMapperClass(){
		StringBuffer content = new StringBuffer("package ");
		content.append(getPkgByClsFull( config.getFullClsName(enmClassType.mapper))).append(";\n");
		
//		content.append("\n\nimport java.util.List;");
//		content.append("\nimport java.util.Map;");
		content.append("\nimport com.mmm.base.dao.BaseDao;");
		//content.append("\nimport java.sql.SQLException;");
		//content.append("\nimport com.hicores.hospital.common.entity.TreeEntity;");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.entity)).append(";\n");
		
		content.append(config.getAutoComment("数据库访问接口"));
		content.append("\npublic interface ").append(config.getMapperClsName()+" extends BaseDao<"+config.getEntityClsName()+">");
		content.append("{");
		//methods
//		content.append("\n\n\t/**\n\t * 根据Key得到第一条记录\n\t */");
//		content.append("\n\tpublic ").
//				append(config.getEntityClsName()).
//				append(" selectByKey("+ config.getEntityClsName() +" params);");
//
//
//		content.append("\n\n\t/**\n\t * 根据翻页对象参数得到记录\n\t */");
//		content.append("\n\tpublic List<").append(config.getEntityClsName()).append(">").
//				append(" selectPageList(SearchPageUtil page);");
//
//
//		content.append("\n\n\t/**\n\t * 根据条件得到全部记录\n\t */");
//		content.append("\n\tpublic List<").append(config.getEntityClsName()).
//				append("> selectAllList(").append(config.getEntityClsName() ).
//				append(" params);");
//
//
//
//		content.append("\n\n\t/**\n\t * 新增一条记录\n\t */");
//		content.append("\n\tpublic int add"+ WordUtils.capitalize(config.getShortObjName())+"(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//
//
//		content.append("\n\n\t/**\n\t * 动态新增一条记录：只设置不是Null的属性\n\t */");
//		content.append("\n\tpublic int addSelective"+ WordUtils.capitalize(config.getShortObjName())+"(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//
//		content.append("\n\n\t/**\n\t * 修改记录\n\t */");
//		content.append("\n\tpublic int update"+ WordUtils.capitalize(config.getShortObjName())+"(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//		content.append("\n\n\t/**\n\t * 动态修改记录：只修改不是Null的属性 \n\t */");
//		content.append("\n\tpublic int updateSelective"+ WordUtils.capitalize(config.getShortObjName())+"(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//		content.append("\n\n\t/**\n\t * 根据条件删除记录\n\t */");
//		content.append("\n\tpublic int deleteByKey(").
//				append(config.getEntityClsName() ).
//				append(" params);");
//
//		content.append("\n\n\t/**\n\t * 根据条件变化一条记录的DelFlag，返回影响的行数\n\t */");
//		content.append("\n\tpublic int updateDelFlag(").
//				append(config.getEntityClsName() ).
//				append(" params);");
//
//		content.append("\n\n\t/**\n\t * 得到记录数\n\t */");
//		content.append("\n\tpublic int selectCount(").append(config.getEntityClsName() ).
//				append(" params);");
//
//		content.append("\n\n\t/**\n\t * 得到重复的记录数\n\t */");
//		content.append("\n\tpublic int selectDupCount(").append(config.getEntityClsName() ).
//				append(" params);");
		
		content.append("\n}");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.mapper),config.isOverwriteFile());
			System.out.println("Successfully wrote mapper class file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 生成Service类
	* @author: alan
	* @date: 2016年5月16日
	* @Title: fillServiceClass
	 */
	private void fillServiceClass(){
		StringBuffer content = new StringBuffer("package ");
		content.append(getPkgByClsFull( config.getFullClsName(enmClassType.service))).append(";\n");
		
//		content.append("\n\nimport java.util.List;");
//		content.append("\nimport java.util.Map;");
		content.append("\n\nimport "+config.getFullClsName(enmClassType.mapper)+";");
		content.append("\nimport com.mmm.base.service.BaseServiceImpl;");
		content.append("\nimport org.springframework.stereotype.Service;");
		//content.append("\nimport java.sql.SQLException;");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.entity)).append(";\n");
		
		content.append(config.getAutoComment("Service逻辑类"));
		content.append("\n@Service");
		content.append("\npublic class ").append(config.getServiceClsName()).append(" extends BaseServiceImpl<"+config.getEntityClsName()+","+config.getMapperClsName()+">");
		content.append("{");
		//methods
//		content.append("\n\n\t/**\n\t * 根据Key得到第一条记录\n\t */");
//		content.append("\n\t@Read");
//		content.append("\n\tpublic ").
//				append(config.getEntityClsName()).
//				append(" selectByKey("+ config.getEntityClsName() +" params);");
//
//
//		content.append("\n\n\t/**\n\t * 根据翻页对象参数得到记录\n\t */");
//		content.append("\n\t@Read");
//		content.append("\n\tpublic Map<String, Object>").
//				append(" selectPageList(SearchPageUtil page);");
//
//
//		content.append("\n\n\t/**\n\t * 根据条件得到全部记录\n\t */");
//		content.append("\n\t@Read");
//		content.append("\n\tpublic List<").append(config.getEntityClsName()).
//				append("> selectAllList(").append(config.getEntityClsName() ).
//				append(" params);");
//
//
//
//		content.append("\n\n\t/**\n\t * 新增一条记录，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" create(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//		content.append("\n\n\t/**\n\t * 动态新增一条记录：只设置不是Null的属性，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" createSelective(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//
//		content.append("\n\n\t/**\n\t * 修改记录，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" update(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//		content.append("\n\n\t/**\n\t *  动态修改记录：只修改不是Null的属性，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" updateSelective(").
//				append(config.getEntityClsName() ).
//				append(" info);");
//
//		content.append("\n\n\t/**\n\t * 根据条件删除记录，返回影响的行数\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic int deleteByKey(").
//				append(config.getEntityClsName() ).
//				append(" params);");
//
//		content.append("\n\n\t/**\n\t * 根据条件变化一条记录的DelFlag，返回影响的行数\n\t */");
//		content.append("\n\t@Write");
//		content.append("\n\tpublic int updateDelFlag(").
//				append(config.getEntityClsName() ).
//				append(" params);");
//
//
//		content.append("\n\n\t/**\n\t * 得到记录数\n\t */");
//		content.append("\n\t@Read");
//		content.append("\n\tpublic int selectCount(").append(config.getEntityClsName() ).
//				append(" params);");
//
//		content.append("\n\n\t/**\n\t * 得到重复的记录数\n\t */");
//		content.append("\n\t@Read");
//		content.append("\n\tpublic int selectDupCount(").append(config.getEntityClsName() ).
//				append(" params);");
//
		content.append("\n}");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.service),config.isOverwriteFile());
			System.out.println("Successfully wrote service class file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	

	/**
	 * 生成ServiceImpl类
	* @author: alan
	* @date: 2016年5月16日
	* @Title: fillServiceClass
	 */
	private void fillServiceImplClass(){
		StringBuffer content = new StringBuffer("package ");
		content.append(getPkgByClsFull( config.getFullClsName(enmClassType.serviceImpl))).append(";\n");
		
		content.append("\n\nimport java.util.List;");
		content.append("\nimport java.util.Map;");
		content.append("\nimport java.util.HashMap;");
		content.append("\nimport org.springframework.beans.factory.annotation.Autowired;");
		content.append("\nimport org.springframework.stereotype.Service;");
//		content.append("\nimport com.hicores.base.logger.BasicAction;");
		
		
		content.append("\nimport com.hicores.base.mybatis.entity.SearchPageUtil;");
		//content.append("\nimport java.sql.SQLException;");
		//content.append("\nimport com.hicores.hospital.common.entity.TreeEntity;");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.entity)).append(";\n");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.mapper)).append(";\n");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.service)).append(";\n");
		
		content.append(config.getAutoComment("Service逻辑实现类"));
		content.append("\n@Service");		
		content.append("\npublic class ").append(config.getImplServiceClsName())
				.append(" implements ").append(config.getServiceClsName());
		content.append("{");
		
		String mapperObj = WordUtils.uncapitalize(config.getMapperClsName());
		content.append("\n\t@Autowired");
		content.append("\n\tprivate ").append(config.getMapperClsName()).append(" ")
				.append(mapperObj).append(";");
		
		
		//methods
		content.append("\n\n\t/**\n\t * 根据Key得到第一条记录\n\t */");
		//content.append("\n\t@Override");
		content.append("\n\tpublic ").
				append(config.getEntityClsName()).
				append(" selectByKey("+ config.getEntityClsName() +" params){");
		content.append("\n\t\treturn ").append(mapperObj).
				append(".selectByKey(params);");
		content.append("\n\t}");
		
		
		content.append("\n\n\t/**\n\t * 根据翻页条件得到翻页记录\n\t */");
		//content.append("\n\t@Override");
		content.append("\n\tpublic Map<String, Object>").
				append(" selectPageList(SearchPageUtil page){");
		content.append("\n\t\tMap<String,Object> map = new HashMap<String,Object>();");
		content.append("\n\t\tmap.put(\"data\",").append(mapperObj).append(".selectPageList(page));");
		content.append("\n\t\tmap.put(\"total\",page.getTotal());");
		content.append("\n\t\treturn map;");
		content.append("\n\t}");
		
		
		content.append("\n\n\t/**\n\t * 根据条件得到全部记录\n\t */");
		//content.append("\n\t@Override");
		content.append("\n\tpublic List<").append(config.getEntityClsName()).
				append("> selectAllList(").append(config.getEntityClsName() ).
				append(" params){");
		content.append("\n\t\treturn ").append(mapperObj).
				append(".selectAllList(params);");
		
		content.append("\n\t}");
		
		
		

		content.append("\n\n\t/**\n\t * 新增一条记录，成功则返回对象，失败返回null\n\t */");
		//content.append("\n\t@Override");
		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" create(").
				append(config.getEntityClsName() ).
				append(" info){");
		content.append("\n\t\tint i = ").append(mapperObj).
					append(".add"+ WordUtils.capitalize(config.getShortObjName())+"(info);");
		content.append("\n\t\tif(i>0) return info;");
		content.append("\n\t\telse return null;");
		content.append("\n\t}");
		
		content.append("\n\n\t/**\n\t * 动态新增一条记录：只设置不是Null的属性，成功则返回对象，失败返回null\n\t */");
		//content.append("\n\t@Override");
		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" createSelective(").
				append(config.getEntityClsName() ).
				append(" info){");
		content.append("\n\t\tint i = ").append(mapperObj).
					append(".addSelective"+ WordUtils.capitalize(config.getShortObjName())+"(info);");
		content.append("\n\t\tif(i>0) return info;");
		content.append("\n\t\telse return null;");
		content.append("\n\t}");
		
		
		
		content.append("\n\n\t/**\n\t * 修改记录，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" update(").
				append(config.getEntityClsName() ).
				append(" info){");
		content.append("\n\t\tint i = ").append(mapperObj).
					append(".update"+ WordUtils.capitalize(config.getShortObjName())+"(info);");
		content.append("\n\t\tif(i>0) return info;");
		content.append("\n\t\telse return null;");
		content.append("\n\t}");
		
		
		content.append("\n\n\t/**\n\t * 动态修改记录：只修改不是Null的属性，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" updateSelective(").
				append(config.getEntityClsName() ).
				append(" info){");
		content.append("\n\t\tint i = ").append(mapperObj).
					append(".updateSelective"+ WordUtils.capitalize(config.getShortObjName())+"(info);");
		content.append("\n\t\tif(i>0) return info;");
		content.append("\n\t\telse return null;");
		content.append("\n\t}");
		
		
		
		content.append("\n\n\t/**\n\t * 根据条件删除记录，返回影响的行数\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic int deleteByKey(").
				append(config.getEntityClsName() ).
				append(" params){");
		content.append("\n\t\treturn ").append(mapperObj).
						append(".deleteByKey(params);");
		content.append("\n\t}");
		
		content.append("\n\n\t/**\n\t * 根据条件变化一条记录的DelFlag，返回影响的行数\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic int updateDelFlag(").
				append(config.getEntityClsName() ).
				append(" params){");
		content.append("\n\t\treturn ").append(mapperObj).
						append(".updateDelFlag(params);");
		content.append("\n\t}");
		
		content.append("\n\n\t/**\n\t * 得到记录数\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic int selectCount(").append(config.getEntityClsName() ).
				append(" params){");
		content.append("\n\t\treturn ").append(mapperObj).
							append(".selectCount(params);");
		content.append("\n\t}");
		

		content.append("\n\n\t/**\n\t * 得到重复的记录数\n\t */");
//		content.append("\n\t@Override");
		content.append("\n\tpublic int selectDupCount(").append(config.getEntityClsName() ).
				append(" params){");
		content.append("\n\t\treturn ").append(mapperObj).
							append(".selectDupCount(params);");
		content.append("\n\t}");
		
		
		content.append("\n}");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.serviceImpl),config.isOverwriteFile());
			System.out.println("Successfully wrote service class file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



	/**
	 * 生成Control类
	* @author: alan
	* @date: 2016年5月16日
	* @Title: fillControllerClass
	 */
	private void fillControllerClass(){
		StringBuffer content = new StringBuffer("package ");
		content.append(getPkgByClsFull( config.getFullClsName(enmClassType.ctroller))).append(";\n");

		content.append("\n\nimport java.util.Date;");
		content.append("\n\nimport java.util.List;");
		content.append("\nimport java.util.Map;");
//		content.append("\nimport org.directwebremoting.annotations.RemoteMethod;");
		content.append("\nimport com.mmm.base.controller.BaseController;");
		content.append("\nimport org.springframework.beans.factory.annotation.Autowired;");
		content.append("\nimport org.springframework.stereotype.Controller;");
		content.append("\nimport org.springframework.web.bind.annotation.RequestMapping;");
//		content.append("\nimport org.springframework.web.bind.annotation.RequestMethod;");
		content.append("\nimport org.springframework.web.bind.annotation.ResponseBody;");

		
		
//		content.append("\nimport com.hicores.base.mybatis.entity.SearchPageUtil;");
		//content.append("\nimport java.sql.SQLException;");
		//content.append("\nimport com.hicores.hospital.common.entity.TreeEntity;");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.entity)).append(";\n");
		content.append("\n\nimport ").append( config.getFullClsName(enmClassType.service)).append(";\n");
		
		content.append(config.getAutoComment("Controller类，和界面交互"));
		content.append("\n@Controller");	
//		content.append("\n@RemoteProxy");
		content.append("\n@RequestMapping(value = \""+ config.getMappingName() +"\")");	
		content.append("\npublic class ").append(config.getCtrlClsName())
				.append(" extends BaseController ");
		content.append("{");
		
//		String serviceObj = WordUtils.uncapitalize(config.getServiceClsName());
//		content.append("\n\t@Autowired");
//		content.append("\n\tprivate ").append(config.getServiceClsName()).append(" ")
//				.append(serviceObj).append(";");
//
		//setAreaPara

		//methods
		//selectByKey
//		content.append("\n\n\t/**\n\t * 根据Key得到第一条记录\n\t */");
////		content.append("\n\t@RequestMapping");
////		content.append("\n\t@ResponseBody");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic ").
//				append(config.getEntityClsName()).
//				append(" selectByKey("+ keyField.getType() +" keyValue){");
//
//		content.append("\n\t\t").append(config.getEntityClsName() ).append(" params = new ")
//				.append(config.getEntityClsName() ).append("();");
//
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//
//		content.append("\n\t\tparams.").append(keyField.setter("keyValue"));
//
//		content.append(";\n\t\treturn ").append(serviceObj).
//				append(".selectByKey(params);");
//		content.append("\n\t}");
//
//
//		//selectPageList
//		content.append("\n\n\t/**\n\t * 根据翻页条件得到翻页记录\n\t */");
//		content.append("\n\t@RequestMapping(value=\"selectPageList\")");
//		content.append("\n\t@ResponseBody");
////		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic Map<String, Object>").
//				append(" selectPageList(").append(config.getEntityClsName())
//				.append(" params,SearchPageUtil page){");
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\tpage.setFields(params);");
//		content.append("\n\t\treturn ").append(serviceObj).
//					append(".selectPageList(page);");
//
//		content.append("\n\t}");
//
//
//		//selectTreeList
////		content.append("\n\n\t/**\n\t * 根据条件得到全部记录的树结构列表数据\n\t */");
////		content.append("\n\t@RequestMapping(value=\"selectTreeList\")");
////		content.append("\n\t@ResponseBody");
////		content.append("\n\t@RemoteMethod");
////		content.append("\n\tpublic List<TreeEntity> selectTreeList(").append(config.getEntityClsName() ).
////				append(" params){");
////
////		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
////		content.append("\n\t\t").append(getAreaPara("params"));
////		content.append("\n\t\tList<").append(config.getEntityClsName()).
////				append("> list = ").append(serviceObj).
////				append(".selectAllList(params);");
////		content.append("\n\t\tList<TreeEntity> treeList = new ArrayList<TreeEntity>();");
////		content.append("\n\t\tif(list!=null && list.size()>0){");
////		content.append("\n\t\t\tfor (").append(config.getEntityClsName()).append(" info : list) {");
////
////		content.append("\n\t\t\t\tTreeEntity node=new TreeEntity();");
////				content.append("\n\t\t\t\tnode.setId(info."+ keyField.getter()+".toString());");
////
////		content.append("\n\t\t\t\t//TODO:设置pid和name\n\t\t\t\t\n\t\t\t\t");
////		content.append("\n\t\t\t\ttreeList.add(node);");
////
////		content.append("\n\t\t\t}");
////		content.append("\n\t\t}");
////		content.append("\n\t\treturn treeList;");
////		content.append("\n\t}");
//
//		//selectAllList
//		content.append("\n\n\t/**\n\t * 根据条件得到全部记录\n\t */");
//		content.append("\n\t@RequestMapping(value=\"selectAllList\")");
//		content.append("\n\t@ResponseBody");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic List<").append(config.getEntityClsName()).
//				append("> selectAllList(").append(config.getEntityClsName() ).
//				append(" params){");
//		content.append("\n\t\tif(params == null) params = new ").append(config.getEntityClsName() ).append("();");
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\treturn ").append(serviceObj).
//				append(".selectAllList(params);");
//
//		content.append("\n\t}");
//
//		//create
//		content.append("\n\n\t/**\n\t * 新增一条记录，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" create(").
//				append(config.getEntityClsName() ).
//				append(" info){");
//
//		content.append("\n\t\tinfo.").
//						append(keyField.setter("PrimaryKeyAndOrderNoAuto.generatePrimaryKey()"))
//						.append(";");
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("info"));
//		content.append("\n\t\tinfo.setAddBy(user.getUserId());");
//		content.append("\n\t\tinfo.setAddName(user.getUserName());");
//		content.append("\n\t\tinfo.setAddTime(new Date());");
//
//		content.append("\n\t\treturn ").append(serviceObj).
//					append(".create(info);");
//		content.append("\n\t}");
//
//		//update
//		content.append("\n\n\t/**\n\t * 修改记录，成功则返回对象，失败返回null\n\t */");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" update(").
//				append(config.getEntityClsName() ).
//				append(" info){");
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("info"));
//		if(!StringUtils.isEmpty(editFieldPart)){
//			content.append("\n\t\tinfo.set"+editFieldPart+"By(user.getUserId());");
//			content.append("\n\t\tinfo.set"+editFieldPart+"Name(user.getUserName());");
//			content.append("\n\t\tinfo.set"+editFieldPart+"Time(new Date());");
//		}
//
//
//		content.append("\n\t\treturn ").append(serviceObj).
//							append(".update(info);");
//		content.append("\n\t}");
//
//		//save
//		content.append("\n\n\t/**\n\t * 保存（同时处理新增和修改的情况）\n\t */");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic ").append(config.getEntityClsName()).append(" save(").
//				append(config.getEntityClsName() ).
//				append(" info){");
//		String s ="";
//		if(keyField.getType().equalsIgnoreCase("long")){
//			s =" || info."+ keyField.getter()+ ".longValue() == 0";
//		}
//		else if(keyField.getType().equalsIgnoreCase("integer")){
//			s =" || info."+ keyField.getter()+ ".intValue() == 0";
//		}
//
//		content.append("\n\t\tif(info.").append(keyField.getter()).append(" == null").append(s).append("){");
//		content.append("\n\t\t\treturn create(info);");
//		content.append("\n\t\t}else{");
//		content.append("\n\t\t\treturn update(info);");
//		content.append("\n\t\t}");
//		content.append("\n\t}");
//
////		//deleteByKey
////		content.append("\n\n\t/**\n\t * 批量保存\n\t */");
////		content.append("\n\t@RemoteMethod");
////		content.append("\n\tpublic int saveList(").append(config.getEntityClsName() ).
////		append(" infos){");
////
////		content.append("\n\t}");
//
//
//
//		//deleteByKey
//		content.append("\n\n\t/**\n\t * 根据条件删除记录，返回影响的行数\n\t */");
////		content.append("\n\t@Override");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic int deleteByKey("+ keyField.getType() +" keyValue){");
//
//		content.append("\n\t\t").append(config.getEntityClsName() ).append(" params = new ")
//				.append(config.getEntityClsName() ).append("();");
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\tparams.").append(keyField.setter("keyValue")).append(";");
//		content.append("\n\t\treturn ").append(serviceObj).
//						append(".deleteByKey(params);");
//		content.append("\n\t}");
//
//
//		//deleteByKey
//		content.append("\n\n\t/**\n\t * 根据条件变化一条记录的DelFlag，返回影响的行数\n\t */");
////		content.append("\n\t@Override");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic int updateDelFlag("+ config.getEntityClsName() ).
//		append(" params){");
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\treturn ").append(serviceObj).
//						append(".updateDelFlag(params);");
//		content.append("\n\t}");
//
//
//
//
//		//selectCount
//		content.append("\n\n\t/**\n\t * 得到记录数\n\t */");
////		content.append("\n\t@Override");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic int selectCount(").append(config.getEntityClsName() ).
//				append(" params){");
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\treturn ").append(serviceObj).
//							append(".selectCount(params);");
//		content.append("\n\t}");
//
//
//
//		//selectCount
//		content.append("\n\n\t/**\n\t * 得到重复的记录数，用于保存的时候判断名称等是否重复，兼容新增和修改的重复判断\n\t */");
////		content.append("\n\t@Override");
//		content.append("\n\t@RemoteMethod");
//		content.append("\n\tpublic int selectDupCount(").append(config.getEntityClsName() ).
//				append(" params){");
//
//		content.append("\n\t\tBaseUserInfo user = Session.getUserInfo();");
//		content.append("\n\t\t").append(getAreaPara("params"));
//		content.append("\n\t\treturn ").append(serviceObj).
//							append(".selectDupCount(params);");
//		content.append("\n\t}");
//
		
		content.append("\n}");
		try {
			FileManager.writeFile(content.toString(),config.getFullFileName(enmClassType.ctroller),config.isOverwriteFile());
			System.out.println("Successfully wrote service class file");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 用sessionUser 设置AreaId和SysId
	* @author: alan
	* @date: 2016年5月18日
	* @Title: getAreaPara  
	* @param paraName
	* @return
	 */
	public String getAreaPara(String paraName) {
		if(!config.isAreaFilter()) return "";
		String s = "\n\t\t";
		String r = s;
		r += "if(" + paraName + ".getAreaId()==null) " + paraName + ".setAreaId(user.getAreaId());";
		r += s + "if(" + paraName + ".getSysId()==null) "+ paraName + ".setSysId(user.getSysId());";
		
		return r;
	}
	
	/**
	 * 获取表的结构
	* @author: alan
	* @date: 2016年5月16日
	* @Title: getStructure  
	* @param tablename
	* @return
	* @throws SQLException
	 */
	protected List<Field> getStructure(String sql)
			throws SQLException {
				Connection conn = null;
				Statement st = null;
				ResultSet rs = null;
				try {
					//直接取得数据库连接
					System.out.println("starting to get fields...");
					Class.forName("com.mysql.jdbc.Driver").newInstance(); //MYSQL驱动


					conn =  DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shop", "root", "root"); //链接本地MYSQL

//					conn = ResourceManager.getConnection(config.getDbFile());
					st = conn.createStatement();
					
					//System.out.println(sql);
					rs=st.executeQuery(sql);
					List<Field> result = new ArrayList<Field>();
					while (rs.next()){
//						System.out.println(rs.getString("column_name").toLowerCase());
//						System.out.println(rs.getString("data_type"));
//						System.out.println(rs.getString("column_comment"));

						Field f = new Field();
						String type = rs.getString("data_type");
						f.setColName(rs.getString("column_name").toLowerCase());
						f.setComment(rs.getString("column_comment"));
						f.setType(getTypeBySqlName(type));
						f.setFieldName(getPropByColName(f.getColName()));
						f.setJdbcType(getJdbcTypeBySqlName(type));
						result.add(f);
						if(keyField == null && f.getColName().equalsIgnoreCase(config.getKeyFieldName())){
							keyField = f;
						}
						if(StringUtils.isEmpty(editFieldPart) && f.getColName().indexOf("edit_by")>=0){
							if(f.getColName().indexOf("last")>=0) editFieldPart = "LastEdit";
							else editFieldPart = "Edit";
						}
					}



					

					System.out.println("Successed to get fields.");
					return result;
				} catch (Exception e) {
					System.out.println("Failed to get fields.");
					e.printStackTrace();
//					throw e;
					return null;
				}
				finally{
					ResourceManager.closeQuietly(conn,st,rs);
				}
			}
	
	/**
	 * 根据SQL 的配型得到Java 的类型
	* @author: alan
	* @date: 2016年5月16日
	* @Title: getClassBySqlName  
	* @param sqlName
	* @return
	 */
	private String getTypeBySqlName(String sqlName){

		String result = sqlName;
		result =result.toUpperCase();
		result = result.replace("DECIMAL","java.math.BigDecimal");
		result = result.replace("INT","Long");
		result = result.replace("BIGINT","Long");
		result = result.replace("VARCHAR","String");
		result = result.replace("DATETIME","Date");
		result = result.replace("BYTE","Long");
		result = result.replace("TIMESTAMP","Date");
		return result;
		
	}
	private String getJdbcTypeBySqlName(String sqlName){
		sqlName = sqlName.toUpperCase();
		String result = sqlName.substring(sqlName.lastIndexOf(".")+1);
		
		if(sqlName.indexOf("STRING")>0){
			result = "VARCHAR";
		}else if(sqlName.indexOf("INTEGER")>0){
			result = "INTEGER";
		}else if(sqlName.indexOf("LONG")>0){
			result = "BIGINT";
		}else if(sqlName.indexOf("BOOLEAN")>0){
			result = "BIT";
		}else if(sqlName.indexOf("SHORT")>0){
			result = "SMALLINT";
		}else if(sqlName.indexOf("BIGDECIMAL")>0){
			result = "DECIMAL";
		}
		
		
			
		return result;
		
	}


	/**
	 * 根据列名得到entity的属性名
	* @author: alan
	* @date: 2016年5月16日
	* @Title: getPropByColName  
	* @param colName
	* @return
	 */
	private String getPropByColName(String colName){
		//分解下划线
		String[] cs = colName.split("_");
		String rs ="";
		for (String str : cs) {
			if(StringUtils.isEmpty(rs))
				rs += WordUtils.uncapitalize(str);
			else
				rs += WordUtils.capitalize(str);
		}
		
		return rs;
	}
	
	
	
	
	/**
	 * 根据全名得到package
	* @author: alan
	* @date: 2016年5月16日
	* @Title: getPkgByClsFull  
	* @param clsFullName
	* @return
	 */
	private String getPkgByClsFull(String clsFullName){
		int i = clsFullName.lastIndexOf(".");
		return clsFullName.substring(0,i);
	}
	
	
	
	
	
	// ////////////////////////// 属性get/set //////////////////////////////


	public boolean isConfigChgOn() {
		return configChgOn;
	}

	/**
	 * 是否需要修改配置文件
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setConfigChgOn  
	* @param configChgOn
	 */
	public void setConfigChgOn(boolean configChgOn) {
		this.configChgOn = configChgOn;
	}

	public boolean isEntityClsOn() {
		return entityClsOn;
	}

	/**
	 * 是否需要生成实体类，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setEntityClsOn  
	* @param entityClsOn 
	 */
	public void setEntityClsOn(boolean entityClsOn) {
		this.entityClsOn = entityClsOn;
	}

	public boolean isMapperClsOn() {
		return mapperClsOn;
	}
	
	/**
	 * 是否需要生成mapper类，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setMapperClsOn  
	* @param mapperClsOn
	 */
	public void setMapperClsOn(boolean mapperClsOn) {
		this.mapperClsOn = mapperClsOn;
	}

	public boolean isMapperFileOn() {
		return mapperFileOn;
	}

	/**
	 * 是否需要生成mapper.xml文件，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setMapperFileOn  
	* @param mapperFileOn
	 */
	public void setMapperFileOn(boolean mapperFileOn) {
		this.mapperFileOn = mapperFileOn;
	}

	public boolean isServiceClsOn() {
		return serviceClsOn;
	}

	/**
	 * 是否需要生成service类，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setServiceClsOn  
	* @param serviceClsOn
	 */
	public void setServiceClsOn(boolean serviceClsOn) {
		this.serviceClsOn = serviceClsOn;
	}

	public boolean isImplServiceClsOn() {
		return implServiceClsOn;
	}

	/**
	 * 是否需要生成service实现类，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setImplServiceClsOn  
	* @param implServiceClsOn
	 */
	public void setImplServiceClsOn(boolean implServiceClsOn) {
		this.implServiceClsOn = implServiceClsOn;
	}

	public boolean isCtrlClsOn() {
		return ctrlClsOn;
	}

	/**
	 * 是否需要生成controller类，false表示跳过
	* @author: alan
	* @date: 2016年5月12日
	* @Title: setCtrlClsOn  
	* @param ctrlClsOn
	 */
	public void setCtrlClsOn(boolean ctrlClsOn) {
		this.ctrlClsOn = ctrlClsOn;
	}
	

}
